package UDP网络计算器;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//为什么要将 +-*/的运算交给服务器？？？
//因为运算是需要消耗CPU资源的，当CPU紧张时，利用服务器引入更多的资源，将数据通过网络传输给服务器进行运算
public class CalServer {
    private DatagramSocket socket=null;

    public CalServer(int port) throws SocketException {
        socket=new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动~~");
        while (true) {
            //1.读取请求并解析
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);//构造空的数据报
            socket.receive(requestPacket);//socket.receive()读取请求，将读取到的请求放到requestPacket
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());

            //2.根据请求计算响应
            String response=process(request);

            //3.将响应写回到客户端
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);

            //打印日志
            String log=String.format("[%s  %d]  request:%s , response:%s ",
                    requestPacket.getAddress().toString(),requestPacket.getPort(),
                    request,response);
            System.out.println(log);
        }
    }

    //process内部就要按照自定义协议的内容进行处理
    //我们定义的请求格式字符串：第一个操作数 ； 第二个操作数 ； 运算符
    //        响应格式字符串：计算结果
    private String process(String request) {
        String[] tokens = request.split(";");

        if (tokens.length!=3) {
            return "[请求格式出错!]";
        }
        //java中如何把 字符串转成整数？？？
        //          Integer.parseInt()
        //java中如何把 整数转成字符串？？？
        //          整数 + ""
        int num1=Integer.parseInt(tokens[0]);
        int num2=Integer.parseInt(tokens[1]);
        String operator=tokens[2];

        int result=0;
        if (operator.equals("+")) {
            result= num1+num2;
        }else if (operator.equals("-")) {
            result= num1-num2;
        }else if (operator.equals("*")) {
            result= num1*num2;
        }else if (operator.equals("/")) {
            result= num1/num2;
        }else {
            return "[请求个数出错！ 操作符有误]";
        }

        return result+"";
    }

}
